package com.guia_digital;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;

public class MainActivity extends Activity {

	protected static final int REQUEST_CODE = 0;
	Button tracar, voz;
	Intent destino;
	List<lugares> news = new ArrayList<lugares>();
	ArrayAdapter<lugares> adapter;
	double lat;
	double lon;

	/** Called when the activity is first created. */
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Exibe o layout principal
		setContentView(R.layout.main);

		final Spinner sp = (Spinner) findViewById(R.id.spinnerDestino);
		adapter = new ArrayAdapter<lugares>(this,
				android.R.layout.simple_spinner_item, news);
		sp.setAdapter(adapter);

		sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
			public void onItemSelected(AdapterView<?> adapterView, View view,
					int i, long l) {
				lugares lugar = new lugares();
				lugar = (lugares) sp.getSelectedItem();
				lat = lugar.getLat();
				lon = lugar.getLon();
				destino.putExtra("lat", lat);
				destino.putExtra("lon", lon);
			}

			public void onNothingSelected(AdapterView<?> parentView) {
				// your code here
			}

		});

		// Criando AsyncTask que buscará o RSS da globo
		new RssAsyncTask()
				.execute("http://www.comp.pucpcaldas.br/~al550385646/lugares.xml");

		// Relaciona os botões com os respectivos do layout
		tracar = (Button) findViewById(R.id.btnTracarRota);
		voz = (Button) findViewById(R.id.btnVoz);

		voz.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// Testa se o aparelho suporta reconhecimento por voz
				PackageManager pm = getPackageManager();
				Intent it = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

				List<ResolveInfo> activities = pm.queryIntentActivities(it, 0);

				if (activities.size() != 0) {
					// Aparelho suporta Reconhecimento de Voz

					Intent intent = new Intent(
							RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

					intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
							RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

					intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
							"Fala alguma coisa!");

					startActivityForResult(intent, REQUEST_CODE);

				} else {
					// Aparelho NÃO suporta Reconhecimento de Voz
					MensagemAlerta("Erro",
							"Seu aparelho não suporta reconhecimento por voz");
				}

			}
		});

		// Define a intent destino para a activity MapaActivity
		destino = new Intent(this, MapaActivity.class);

		// Quando clicar no botao tracar rota, chama outra activity
		// (Mapa), que ira tracar a rota da posicao atual até o destino

		tracar.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				startActivity(destino);

			}
		});

	}

 
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {

			// Contém a lista com os resultados
			int j = 0;
			ArrayList<String> matches = data
					.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
			MensagemAlerta("Pesquisa", "Voce pesquisou por" + matches.get(0));
			for (int i = 0; i < news.size(); i++) {
				if (news.get(i).toString().toLowerCase()
						.equals(matches.get(0).toLowerCase())) {
					j = 1;
					lugares lugar = new lugares();
					lugar = (lugares) news.get(i);
					lat = lugar.getLat();
					lon = lugar.getLon();
					destino.putExtra("lat", lat);
					destino.putExtra("lon", lon);
				} else {

				}
			}
			if (j == 1) {

				MensagemAlerta("Achou", "Gerar rota");
			}
			startActivity(destino);

		}
	}

	// Método que lê o XML do RSS
	private List<lugares> readXML(InputStream is) {
		List<lugares> noticias = new ArrayList<lugares>();

		try {
			// Criando os objetos que representam o XML
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();

			DocumentBuilder builder = factory.newDocumentBuilder();
			Document xmlDocument = builder.parse(is);

			// Cada notícia é representada pela tag <item>
			// Aqui obtemos a lista de nós com essa tag
			NodeList posts = xmlDocument.getElementsByTagName("lugar");

			// Vamos iterar sobre a lista de itens
			String titulo = null;
			String descricao = null;
			int tipo = 0;
			String imagem = null;
			double lat = 0;
			double lon = 0;

			for (int i = 0; i < posts.getLength(); i++) {
				Node post = posts.item(i);

				// Cada nó ITEM tem os filhos:
				// TITLE, DESCRIPTION e LINK
				NodeList postInfo = post.getChildNodes();
				for (int j = 0; j < postInfo.getLength(); j++) {
					Node info = postInfo.item(j);

					if ("titulo".equals(info.getNodeName())) {
						titulo = info.getFirstChild().getNodeValue();

					} else if ("tipo".equals(info.getNodeName())) {
						tipo = Integer.parseInt(info.getFirstChild()
								.getNodeValue());

					} else if ("descricao".equals(info.getNodeName())) {
						descricao = info.getFirstChild().getNodeValue();
					} else if ("url".equals(info.getNodeName())) {
						imagem = info.getFirstChild().getNodeValue();

					} else if ("lat".equals(info.getNodeName())) {
						lat = Double.parseDouble(info.getFirstChild()
								.getNodeValue());

					} else if ("lon".equals(info.getNodeName())) {
						lon = Double.parseDouble(info.getFirstChild()
								.getNodeValue());

					}
				}
				// Com as informações das tags, criamos o
				// objeto notícia e adicionamos na lista
				noticias.add(new lugares(titulo, descricao, tipo, imagem, lat,
						lon));
			}
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return noticias;
	}

	class RssAsyncTask extends AsyncTask<String, Void, List<lugares>> {

		ProgressDialog dialog;

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			// Antes de baixaro XML, mostra o dialog
			dialog = ProgressDialog.show(MainActivity.this, "Aguarde",
					"Baixando RSS");
		}

		@Override
		protected List<lugares> doInBackground(String... params) {

			List<lugares> lista = null;
			HttpURLConnection conexao = null;
			InputStream is = null;

			try {
				URL url = new URL(params[0]);
				conexao = (HttpURLConnection) url.openConnection();
				conexao.connect();

				is = conexao.getInputStream();
				lista = readXML(is);

			} catch (Throwable t) {
				t.printStackTrace();
			} finally {
				try {
					if (is != null)
						is.close();
					if (conexao != null)
						conexao.disconnect();
				} catch (Throwable t) {
				}
			}
			return lista;
		}

		@Override
		protected void onPostExecute(List<lugares> result) {
			super.onPostExecute(result);
			dialog.dismiss();
			news.addAll(result);
			adapter.notifyDataSetChanged();
		}
	}

	// Exibe mensagens de informações ou erros
	public void MensagemAlerta(String titulo, String texto) {
		AlertDialog.Builder Mensagem = new AlertDialog.Builder(
				MainActivity.this);
		Mensagem.setTitle(titulo);
		Mensagem.setMessage(texto);
		Mensagem.setNeutralButton("OK", null);
		Mensagem.show();
	}
}